home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / PowerPlant / AGA Classes 1.2 / Sliders / LAGAPointedVSlider.cp < prev    next >
Text File  |  1996-06-30  |  18KB  |  615 lines

  1. // ===========================================================================
  2. //    LAGAPointedVSlider.cp
  3. // ===========================================================================
  4. //    “Apple Grayscale Appearance” compliant pointed vertical slider control
  5. //    Copyright © 1996 Chrisoft (Christophe ANDRES)  All rights reserved.
  6. //
  7. //    You may use this source code in any application (commercial, shareware, freeware,
  8. //    postcardware, etc), but not remove this notice (no need to acknowledge the use of
  9. //    this class in the about box)
  10. //    You may not sell this source code in any form. This source code may be placed on 
  11. //    publicly accessable archive sites and source code disks. It may not be placed on 
  12. //    profit archive sites and source code disks without the permission of the author, 
  13. //    Christophe ANDRES.
  14. //    
  15. //        This source code is distributed in the hope that it will be useful,
  16. //        but WITHOUT ANY WARRANTY; without even the implied warranty of
  17. //        MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  18. //
  19. //    If you make any change or improvement on this class, please send the improved/changed
  20. //    version to : chrisoft@calva.net or Christophe ANDRES
  21. //                                     20, rue Prosper Mérimée
  22. //                                     67100 STRASBOURG
  23. //                                     FRANCE
  24. //
  25. // ===========================================================================
  26. //    LAGAPointedVSlider.h            <- double-click + Command-D to see class declaration
  27. //
  28. //    LAGAPointedVSlider is my implementation of the “Apple Grayscale Appearance for System 7.5”
  29. //        vertical pointed slider control
  30. //
  31. //        This class requires LAGASliderBase.cp to be present in your project
  32. //        This class requires AGAColors.cp to be present in your project
  33. //
  34. //        Version : 1.2
  35. //
  36. //        Change History (most recent first, date in US form : mm/dd/yy):
  37. //
  38. //                        06/30/96    ca        Public release of version 1.2
  39. //                        06/27/96    ca        Changed checks for disabled state (check on triState_On instead of triState_Off)
  40. //                                                            in order that triState_Latent state is drawn as disabled
  41. //                        06/04/96    ca        Added RegisterClass method to ease registry
  42. //                                                        Increased version to 1.2
  43. //                        05/16/96    ca        class made available by Christophe ANDRES <chrisoft@calva.net>
  44. //                                                        (version 1.1)
  45. //
  46. //        To Do:
  47. //                        A subclass that draws also some labels
  48. //
  49.  
  50. #include "LAGAPointedVSlider.h"
  51. #include "AGAColors.h"
  52. #include <UDrawingState.h>
  53. #include <PP_Types.h>
  54.  
  55. //    begin    <06/04/96    ca>
  56. void LAGAPointedVSlider::RegisterClass ()
  57.  
  58. {
  59.     URegistrar::RegisterClass(LAGAPointedVSlider::class_ID, (ClassCreatorFunc)LAGAPointedVSlider::CreateAGAPointedVSliderStream);
  60. }
  61. //    end    <06/04/96    ca>
  62.  
  63. LAGAPointedVSlider* LAGAPointedVSlider::CreateAGAPointedVSliderStream (LStream *inStream)
  64.  
  65. {
  66.     return(new LAGAPointedVSlider(inStream));
  67. }
  68.  
  69. //-------Constructors-------------------------------------------------------------------------------------------------
  70.  
  71. LAGAPointedVSlider::LAGAPointedVSlider ()
  72.  
  73. {
  74.     mVerticalSlider = true;
  75.     mDrawDivisions = false;
  76. }
  77.  
  78. LAGAPointedVSlider::LAGAPointedVSlider (LStream    *inStream) : LAGASliderBase(inStream)
  79.  
  80. {
  81.     unsigned char theBoolean;
  82.  
  83.     inStream->ReadData(&theBoolean, sizeof(unsigned char));
  84.     mDrawDivisions = (theBoolean != 0);
  85. }
  86.  
  87. LAGAPointedVSlider::LAGAPointedVSlider (const LAGAPointedVSlider &inOriginal) : LAGASliderBase(inOriginal)
  88.  
  89. {
  90.     mDrawDivisions = inOriginal.mDrawDivisions;
  91. }
  92.  
  93. LAGAPointedVSlider::LAGAPointedVSlider (const SPaneInfo    &inPaneInfo, MessageT inValueMessage, Boolean inBottomRightPointer,
  94.                                                                                 Boolean inDrawDivisions, Int32 inInitialValue, Int32 inMinValue, Int32 inMaxValue)
  95.                                                                             : LAGASliderBase(inPaneInfo, inValueMessage, true, inBottomRightPointer, inInitialValue,
  96.                                                                                                                 inMinValue, inMaxValue)
  97. {
  98.     mDrawDivisions = inDrawDivisions;
  99. }
  100.  
  101. //-------Drawers----------------------------------------------------------------------------------------------------
  102.  
  103.  
  104. void LAGAPointedVSlider::DrawIndicator (Boolean inPushed)
  105.  
  106. {
  107.     StColorPenState theState;
  108.     Boolean hasColor = ::PaneInColor(this);
  109.     Boolean disabled = (mEnabled != triState_On);                                                                                                    //    <06/27/96    ca>
  110.     Rect frame;
  111.  
  112.     theState.Normalize();
  113.     CalcLocalFrameRect(frame);
  114.     
  115.     short position = GetIndicatorPosition();
  116.     
  117.     short origin = (mRightBottomPointing ? frame.left : frame.right - 1);
  118.     short direction = (mRightBottomPointing ? 1 : -1);
  119.     
  120.     ::SetRect(&frame, (mRightBottomPointing ? origin : origin - 15), position - 7, (mRightBottomPointing ? origin + 15 : origin),
  121.                                         position + 7);
  122.     if (hasColor)
  123.         ::RGBBackColor(&gAGAColorArray[2]);
  124.     EraseRect(&frame);
  125.     if (hasColor && !disabled)
  126.         {
  127.             Rect r = frame;
  128.             if (mRightBottomPointing)
  129.                 {
  130.                     r.left++;
  131.                     r.right -= 5;
  132.                 }
  133.             else
  134.                 r.left += 6;
  135.             r.top++;
  136.             r.bottom++;
  137.             ::RGBBackColor((inPushed ? &gAGAColorArray[8] : &gAGAColorArray[5]));
  138.             ::EraseRect(&r);
  139.             ::RGBForeColor((inPushed ? &gAGAColorArray[8] : &gAGAColorArray[5]));
  140.             ::MoveTo(origin + (direction * 10), position + 4);
  141.             ::Line(0, -8);
  142.             ::Move(direction * 1, 1);
  143.             ::Line(0, 6);
  144.             ::Move(direction * 1, -1);
  145.             ::Line(0, -4);
  146.             ::Move(direction * 1, 1);
  147.             ::Line(0, 2);
  148.         }
  149.     
  150.     if (disabled)
  151.         {
  152.             if (hasColor)
  153.                 ::RGBForeColor(&gAGAColorArray[8]);
  154.             else
  155.                 ::PenPat(&qd.gray);
  156.         }
  157.     else
  158.         ::ForeColor(blackColor);
  159.     ::MoveTo(origin + (direction * 1), position - 7);
  160.     ::Line(direction * 8, 0);
  161.     if (!hasColor && disabled)
  162.         ::PenPat(&qd.black);
  163.     ::Line(direction * 6, 6);
  164.     if (!hasColor && disabled)
  165.         ::PenPat(&qd.gray);
  166.     ::Line(0, 2);
  167.     if (!hasColor && disabled)
  168.         ::PenPat(&qd.black);
  169.     ::Line(-(direction * 6), 6);
  170.     if (!hasColor && disabled)
  171.         ::PenPat(&qd.gray);
  172.     ::Line(-(direction * 8), 0);
  173.     ::Move(-(direction * 1), -1);
  174.     ::Line(0, -12);
  175.     
  176.     if (hasColor)
  177.         {
  178.             if (mRightBottomPointing)
  179.                 {
  180.                     ::RGBForeColor((disabled ? &gAGAColorArray[1] : (inPushed ? &gAGAColorArray[5] : &gAGAColorArray[3])));
  181.                     ::Move(1, 1);        ::Line(0, 10);
  182.                     ::Move(1, -11);    ::Line(7, 0);
  183.                     if (!disabled)
  184.                         {
  185.                             ::Move(-1, 3);    ::Line(-4, 0);
  186.                             ::Move(0, 2);        ::Line(4, 0);
  187.                             ::Move(0, 2);        ::Line(-4, 0);
  188.                         }
  189.                     ::RGBForeColor((disabled ? &gAGAColorArray[4] : (inPushed ? &gAGAColorArray[10] : &gAGAColorArray[8])));
  190.                     ::MoveTo(origin + 2, position + 6);
  191.                     ::Line(7, 0);
  192.                     ::Line(5, -5);
  193.                     ::Line(0, -2);
  194.                     ::Line(-4, -4);
  195.                     ::RGBForeColor((disabled ? &gAGAColorArray[W] : (inPushed ? &gAGAColorArray[3] : &gAGAColorArray[1])));
  196.                     ::Move(-9, -1);        ::Line(0, 0);
  197.                     if (!disabled)
  198.                         {
  199.                             ::Move(2, 3);        ::Line(0, 0);
  200.                             ::Move(0, 2);        ::Line(0, 0);
  201.                             ::Move(0, 2);        ::Line(0, 0);
  202.                             ::RGBForeColor((inPushed ? &gAGAColorArray[12] : &gAGAColorArray[10]));
  203.                             ::Move(1, 1);        ::Line(5, 0);
  204.                             ::Move(0, -2);    ::Line(-5, 0);
  205.                             ::Move(0, -2);    ::Line(5, 0);
  206.                         }
  207.                 }
  208.             else
  209.                 {
  210.                     ::RGBForeColor((disabled ? &gAGAColorArray[4] : (inPushed ? &gAGAColorArray[10] : &gAGAColorArray[8])));
  211.                     ::Move(-1, 1);        ::Line(0, 11);
  212.                     ::Line(-8, 0);
  213.                     ::Line(-4, -4);
  214.                     ::RGBForeColor((disabled ? &gAGAColorArray[1] : (inPushed ? &gAGAColorArray[5] : &gAGAColorArray[3])));
  215.                     ::Move(-1, -2);        ::Line(0, 0);
  216.                     ::Move(1, -2);        ::Line(3, -3);
  217.                     ::Move(2, -1);        ::Line(6, 0);
  218.                     if (!disabled)
  219.                         {
  220.                             ::Move(-2, 3);    ::Line(-4, 0);
  221.                             ::Move(0, 2);        ::Line(4, 0);
  222.                             ::Move(0, 2);        ::Line(-4, 0);
  223.                         }
  224.                     ::RGBForeColor((disabled ? &gAGAColorArray[W] : (inPushed ? &gAGAColorArray[3] : &gAGAColorArray[1])));
  225.                     ::MoveTo(origin - 14, position - 1);
  226.                     ::Line(0, 0);
  227.                     ::Move(5, -5);    ::Line(0, 0);
  228.                     if (!disabled)
  229.                         {
  230.                             ::Move(0, 3);        ::Line(0, 0);
  231.                             ::Move(0, 2);        ::Line(0, 0);
  232.                             ::Move(0, 2);        ::Line(0, 0);
  233.                             ::RGBForeColor((inPushed ? &gAGAColorArray[12] : &gAGAColorArray[10]));
  234.                             ::Move(1, 1);        ::Line(5, 0);
  235.                             ::Move(0, -2);    ::Line(-5, 0);
  236.                             ::Move(0, -2);    ::Line(5, 0);
  237.                             ::RGBForeColor((inPushed ? &gAGAColorArray[8] : &gAGAColorArray[5]));
  238.                             ::Move(-11, 3);    ::Line(0, 0);
  239.                         }
  240.                 }
  241.         }
  242.     else
  243.         if (!disabled)
  244.             {
  245.                 ::PenPat(&qd.black);
  246.                 ::Move(direction * 4, 4);
  247.                 ::Line(direction * 5, 0);
  248.                 ::Move(0, 2);
  249.                 ::Line(direction * -5, 0);
  250.                 ::Move(0, 2);
  251.                 ::Line(direction * 5, 0);
  252.             }
  253. }
  254.  
  255. Int16 LAGAPointedVSlider::FindHotSpot (Point inPoint)
  256.  
  257. {
  258.     Rect frame;
  259.     
  260.     //    The only hot spot we know of in a slider is the pointer
  261.     GetIndicatorRect(frame);
  262.                                         
  263.     return(::PtInRect(inPoint, &frame) ? 1 : 0);
  264. }
  265.  
  266. Boolean LAGAPointedVSlider::PointInHotSpot (Point inPoint, Int16 inHotSpot)
  267.  
  268. {
  269.     Rect frame;
  270.     
  271.     //    The only hot spot we know of in a slider is the pointer
  272.     GetIndicatorRect(frame);
  273.                                     
  274.     return(::PtInRect(inPoint, &frame));
  275. }
  276.  
  277. short LAGAPointedVSlider::GetIndicatorPosition ()
  278.  
  279. {
  280.     Rect frame;
  281.  
  282.     CalcLocalFrameRect(frame);
  283.     double size = (frame.bottom - frame.top) - 22;
  284.     double division = size / (double)(mMaxValue - mMinValue);
  285.     
  286.     return(frame.bottom - 11 - ((mValue - mMinValue) * division));
  287. }
  288.  
  289. void LAGAPointedVSlider::GetIndicatorRect (Rect &outRect)
  290.  
  291. {
  292.     Rect frame;
  293.     
  294.     CalcLocalFrameRect(frame);
  295.     short position = GetIndicatorPosition();
  296.     short origin = (mRightBottomPointing ? frame.left : frame.right - 1);
  297.     
  298.     ::SetRect(&outRect, (mRightBottomPointing ? origin : origin - 15), position - 7, (mRightBottomPointing ? origin + 16 : origin + 1),
  299.                                             position + 8);
  300. }
  301.  
  302. void LAGAPointedVSlider::InitializeGhost ()
  303.  
  304. {
  305.     Boolean hasColor = ::PaneInColor(this);
  306.     Rect r;
  307.  
  308.     LAGASliderBase::InitializeGhost();
  309.     
  310.     mGhostPointer->BeginDrawing();
  311.     
  312.     if (hasColor)
  313.         ::RGBBackColor(&gAGAColorArray[2]);
  314.     ::SetRect(&r, 0, 0, 16, 15);
  315.     ::EraseRect(&r);
  316.     
  317.     short origin = (mRightBottomPointing ? r.left : r.right - 1);
  318.     short direction = (mRightBottomPointing ? 1 : -1);
  319.     
  320.     if (hasColor)
  321.         ::RGBForeColor(&gAGAColorArray[7]);
  322.     ::MoveTo(origin + (direction * 1), 0);
  323.     ::Line(direction * 8, 0);
  324.     ::Line(direction * 6, 6);
  325.     ::Line(0, 2);
  326.     ::Line(direction * -6, 6);
  327.     ::Line(direction * -8, 0);
  328.     ::Move(direction * -1, -1);
  329.     ::Line(0, -12);
  330.     ::Move(direction * 4, 12);
  331.     ::Line(0, 0);
  332.     ::Move(direction * 4, 0);
  333.     ::Line(0, 0);
  334.     if (hasColor)
  335.         {
  336.             if (mRightBottomPointing)
  337.                 {
  338.                     ::RGBForeColor(&gAGAColorArray[5]);
  339.                     ::Move(0, -1);    ::Line(0, -2);
  340.                     ::Move(-4, 0);    ::Line(0, 2);
  341.                     ::Move(1, -3);    ::Line(2, 0);
  342.                     ::Move(2, 0);        ::Line(0, 0);
  343.                     ::Move(0, -2);    ::Line(0, 0);
  344.                     ::Move(-2, 0);    ::Line(-2, 0);
  345.                     ::Move(0, -2);    ::Line(2, 0);
  346.                     ::Move(2, 0);        ::Line(0, 0);
  347.                     ::Move(-1, -2);    ::Line(0, -1);
  348.                     ::Move(-4, 0);    ::Line(0, 1);
  349.                     ::RGBForeColor(&gAGAColorArray[4]);
  350.                     ::Move(6, -1);    ::Line(4, 4);
  351.                     ::Line(0, 2);        ::Line(-5, 5);
  352.                     ::Move(-2, 0);    ::Line(-2, 0);
  353.                     ::Move(-2, 0);    ::Line(-1, 0);
  354.                     ::RGBForeColor(&gAGAColorArray[11]);
  355.                     ::Move(2, 1);        ::Line(0, 0);
  356.                     ::Move(4, 0);        ::Line(0, 0);
  357.                     ::Move(0, -14);    ::Line(0, 0);
  358.                     ::Move(-4, 0);    ::Line(0, 0);
  359.                     ::RGBForeColor(&gAGAColorArray[1]);
  360.                     ::Move(-3, 1);    ::Line(0, 0);
  361.                     ::RGBForeColor(&gAGAColorArray[9]);
  362.                     ::Move(3, 4);        ::Line(0, 0);
  363.                     ::Move(4, 0);        ::Line(0, 0);
  364.                     ::Move(0, 2);        ::Line(0, 0);
  365.                     ::Move(-4, 0);    ::Line(0, 0);
  366.                     ::Move(0, 2);        ::Line(0, 0);
  367.                     ::Move(4, 0);        ::Line(0, 0);
  368.                     ::ForeColor(whiteColor);
  369.                     ::Move(-1, -1);    ::Line(-2, 0);
  370.                     ::Move(-2, 0);    ::Line(0, 0);
  371.                     ::Move(0, -2);    ::Line(0, 0);
  372.                     ::Move(2, 0);        ::Line(2, 0);
  373.                     ::Move(0, -2);    ::Line(-2, 0);
  374.                     ::Move(-2, 0);    ::Line(0, 0);
  375.                     ::Move(6, -3);    ::Line(0, 0);
  376.                     ::Move(-2, 0);    ::Line(-2, 0);
  377.                     ::Move(-2, 0);    ::Line(-1, 0);
  378.                     ::Move(-1, 1);    ::Line(0, 10);
  379.                 }
  380.             else
  381.                 {
  382.                     ::RGBForeColor(&gAGAColorArray[5]);
  383.                     ::Move(0, -1);    ::Line(0, -2);
  384.                     ::Move(4, 0);        ::Line(0, 2);
  385.                     ::Move(1, -3);    ::Line(0, 0);
  386.                     ::Move(-2, 0);    ::Line(-2, 0);
  387.                     ::Move(0, -2);    ::Line(2, 0);
  388.                     ::Move(2, 0);        ::Line(0, 0);
  389.                     ::Move(0, -2);    ::Line(0, 0);
  390.                     ::Move(-2, 0);    ::Line(-2, 0);
  391.                     ::Move(-1, -2);    ::Line(0, -1);
  392.                     ::Move(4, 0);        ::Line(0, 1);
  393.                     ::RGBForeColor(&gAGAColorArray[4]);
  394.                     ::Move(3, -1);    ::Line(0, 11);
  395.                     ::Line(-2, 0);
  396.                     ::Move(-2, 0);    ::Line(-2, 0);
  397.                     ::Move(-2, 0);    ::Line(-4, -4);
  398.                     ::RGBForeColor(&gAGAColorArray[1]);
  399.                     ::Move(-1, -2);    ::Line(0, 0);
  400.                     ::RGBForeColor(&gAGAColorArray[9]);
  401.                     ::Move(6, 2);        ::Line(0, 0);
  402.                     ::Move(4, 0);        ::Line(0, 0);
  403.                     ::Move(0, -2);    ::Line(0, 0);
  404.                     ::Move(-4, 0);    ::Line(0, 0);
  405.                     ::Move(0, -2);    ::Line(0, 0);
  406.                     ::Move(4, 0);        ::Line(0, 0);
  407.                     ::RGBForeColor(&gAGAColorArray[11]);
  408.                     ::Move(0, -5);    ::Line(0, 0);
  409.                     ::Move(-4, 0);    ::Line(0, 0);
  410.                     ::Move(0, 14);    ::Line(0, 0);
  411.                     ::Move(4, 0);        ::Line(0, 0);
  412.                     ::ForeColor(whiteColor);
  413.                     ::Move(-1, -6);    ::Line(-2, 0);
  414.                     ::Move(-2, 0);    ::Line(0, 0);
  415.                     ::Move(0, -2);    ::Line(0, 0);
  416.                     ::Move(2, 0);        ::Line(2, 0);
  417.                     ::Move(0, -2);    ::Line(-2, 0);
  418.                     ::Move(-2, 0);    ::Line(0, 0);
  419.                     ::Move(-5, 2);    ::Line(5, -5);
  420.                     ::Move(2, 0);        ::Line(2, 0);
  421.                     ::Move(2, 0);        ::Line(1, 0);
  422.                 }
  423.         }
  424.     
  425.     mGhostPointer->EndDrawing();
  426.  
  427.     //    Define a region to draw the pointer nicely if the ghost passes on its top
  428.     mGhostMask = ::NewRgn();
  429.     ::OpenRgn();
  430.     ::MoveTo(origin + (direction * 1), 0);
  431.     ::Line(direction * 8, 0);
  432.     ::Line(direction * 6, 6);
  433.     ::Line(0, 2);
  434.     ::Line(direction * -6, 6);
  435.     ::Line(direction * -8, 0);
  436.     ::Line(direction * -1, -1);
  437.     ::Line(0, -12);
  438.     ::Line(direction * 1, -1);
  439.     ::CloseRgn(mGhostMask);
  440. }
  441.  
  442. void LAGAPointedVSlider::DrawGhost (Point inPoint)
  443.  
  444. {
  445.     Rect frame;
  446.     short position;
  447.  
  448.     if (inPoint.v != mLastPosition.v)
  449.         {
  450.             Rect indicRect, overStep;
  451.             
  452.             CalcLocalFrameRect(frame);
  453.             double size = (frame.bottom - frame.top) - 22;
  454.             double division = size / (double)(mMaxValue - mMinValue);
  455.             
  456.             short MaxPt = frame.bottom - 11 - ((mMaxValue - mMinValue) * division);
  457.             short MinPt = frame.bottom - 11;
  458.             short origin = (mRightBottomPointing ? frame.left : frame.right - 1);
  459.             if (inPoint.v < MaxPt)
  460.                 position = MaxPt;
  461.             else
  462.                 if (inPoint.v > MinPt)
  463.                     position = MinPt;
  464.                 else
  465.                     position = inPoint.v;
  466.             
  467.             frame.left = (mRightBottomPointing ? origin : origin - 15);
  468.             frame.right = frame.left + 16;
  469.             frame.top = position - 7;
  470.             frame.bottom = frame.top + 15;
  471.             
  472.             if (!::EmptyRect(&mLastGhost))
  473.                 {
  474.                     indicRect = mLastGhost;
  475.                     StClipRgnState clip;
  476.                     
  477.                     if (indicRect.top < frame.top)
  478.                         {
  479.                             if (indicRect.bottom > frame.top)
  480.                                 indicRect.bottom = frame.top;
  481.                         }
  482.                     else
  483.                         {
  484.                             if (frame.bottom > indicRect.top)
  485.                                 indicRect.top = frame.bottom;
  486.                         }
  487.                     clip.ClipToIntersection(indicRect);
  488.                     ::RGBBackColor(&gAGAColorArray[2]);
  489.                     ::EraseRect(&mLastGhost);
  490.                     DrawSlideTrack();
  491.                     GetIndicatorRect(indicRect);
  492.                     if (::SectRect(&indicRect, &mLastGhost, &overStep))
  493.                         DrawIndicator(true);
  494.                 }
  495.             
  496.             StColorPenState theState;
  497.             theState.Normalize();
  498.             mGhostPointer->CopyImage(GetMacPort(), frame);
  499.  
  500.             if ((!::EmptyRect(&overStep)) && (mGhostMask != nil))
  501.                 {
  502.                     StClipRgnState clip;
  503.                     ::OffsetRgn(mGhostMask, -(*mGhostMask)->rgnBBox.left, -(*mGhostMask)->rgnBBox.top);
  504.                     ::OffsetRgn(mGhostMask, frame.left, frame.top);
  505.                     RgnHandle theClipRegion = ::NewRgn();
  506.                     GetIndicatorRect(indicRect);
  507.                     ::RectRgn(theClipRegion, &indicRect);
  508.                     ::DiffRgn(theClipRegion, mGhostMask, theClipRegion);
  509.                     clip.ClipToIntersectionRgn(theClipRegion);
  510.                     DrawIndicator(true);
  511.                 }
  512.             mLastGhost = frame;
  513.             mLastPosition = inPoint;
  514.         }
  515. }
  516.  
  517. void LAGAPointedVSlider::FinishTrackHotSpot (Point inPoint)
  518.  
  519. {
  520.     Boolean hasColor = ::PaneInColor(this);
  521.     Rect frame, indicRect;
  522.     short newValue;
  523.  
  524.     CalcLocalFrameRect(frame);
  525.     double size = (frame.bottom - frame.top) - 22;
  526.     double division = size / (double)(mMaxValue - mMinValue);
  527.             
  528.     short MaxPt = frame.bottom - 11 - ((mMaxValue - mMinValue) * division);
  529.     short MinPt = frame.bottom - 11;
  530.     if (inPoint.v <= MaxPt)
  531.         newValue = mMaxValue;
  532.     else
  533.         if (inPoint.v >= MinPt)
  534.             newValue = mMinValue;
  535.         else
  536.             {
  537.                 newValue = ((MinPt - inPoint.v) / division) + mMinValue;
  538.                 short lowPos = frame.bottom - 11 - (newValue * division);
  539.                 short highPos = frame.bottom - 11 - ((newValue + 1) * division);
  540.                 if ((lowPos - inPoint.v) > (inPoint.v - highPos))
  541.                     newValue++;
  542.             }
  543.     
  544.     if (newValue != mValue)
  545.         {
  546.             StClipRgnState clip;
  547.             clip.Normalize();
  548.             GetIndicatorRect(indicRect);
  549.             if (hasColor)
  550.                 ::RGBBackColor(&gAGAColorArray[2]);
  551.             ::EraseRect(&indicRect);
  552.             ::EraseRect(&mLastGhost);
  553.             DrawSlideTrack();
  554.             //    Update our control value and Broadcast it
  555.             SetValue(newValue);
  556.         }
  557.     else
  558.         {
  559.             if (hasColor)
  560.                 ::RGBBackColor(&gAGAColorArray[2]);
  561.             ::EraseRect(&mLastGhost);
  562.             DrawSlideTrack();
  563.         }
  564.     //    We dont redraw the pointer here, because it will anyway be redrawn in the unpressed state
  565.     //    in the method LAGASliderBase::HotSpotResult
  566. }
  567.  
  568. void LAGAPointedVSlider::DrawLabels ()
  569.  
  570. {
  571.     if (mDrawDivisions)
  572.         {
  573.             StColorPenState theState;
  574.             Boolean hasColor = ::PaneInColor(this);
  575.             Boolean disabled = (mEnabled != triState_On);                                                                                                            //    <06/27/96    ca>
  576.             Rect frame;
  577.             CalcLocalFrameRect(frame);
  578.             
  579.             double size = (frame.bottom - frame.top) - 22;
  580.             double division = size / (double)(mMaxValue - mMinValue);
  581.             short step = 1;
  582.             if (division < 4)
  583.                 step = 2;
  584.             short origin = (mRightBottomPointing ? frame.left : frame.right - 1);
  585.             short direction = (mRightBottomPointing ? 1 : -1);
  586.             short position;
  587.             for (int i = mMinValue; i <= mMaxValue; i += step)
  588.                 {
  589.                     position = frame.bottom - 11 - ((i - mMinValue) * division);
  590.                     if (hasColor)
  591.                         ::RGBForeColor((disabled ? &gAGAColorArray[8] : &gAGAColorArray[B]));
  592.                     else
  593.                         if (disabled)
  594.                             ::PenPat(&qd.gray);
  595.                     
  596.                     ::MoveTo(origin + (direction * 17), position);
  597.                     ::Line(direction * 5, 0);
  598.                     if (hasColor)
  599.                         {
  600.                             if (!mRightBottomPointing)
  601.                                 ::Move(5, 0);
  602.                             ::RGBForeColor((disabled ? &gAGAColorArray[4] : &gAGAColorArray[7]));
  603.                             ::Move(1, 0);
  604.                             ::Line(0, 1);
  605.                             ::Line(-6, 0);
  606.                             ::ForeColor(whiteColor);
  607.                             ::Move(-1, -1);
  608.                             ::Line(0, -1);
  609.                             ::Line(6, 0);
  610.                         }
  611.                 }
  612.         }
  613. }
  614.  
  615.